package editorarquivobmg.gui;

import editorarquivobmg.codificacao.ANSI;
import editorarquivobmg.codificacao.UTF8;
import editorarquivobmg.codificacao.Unicode;
import editorarquivobmg.service.BmgFileService;
import editorarquivobmg.service.CodificacaoService;
import editorarquivobmg.service.ContadorPixelService;
import editorarquivobmg.service.ManipuladorArquivoService;
import editorarquivobmg.service.ManipuladorScriptService;
import editorarquivobmg.service.MapeamentoTextoService;
import editorarquivobmg.util.ManipuladorDados;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JSpinner;
import javax.swing.KeyStroke;
import javax.swing.event.ChangeListener;

public class PresenterTelaPrincipal {

    private int index = 0;
    private TelaPrincipal telaPrincipal = null;
    private BmgFileService bmgFileService = null;
    private ContadorPixelService contadorPixelService = null;
    private MapeamentoTextoService mapeamentoTextoService = null;
    private CodificacaoService codificacaoService = null;
    private ManipuladorScriptService manipuladorScriptService = null;
    private ManipuladorArquivoService manipuladorArquivoService = null;

    PresenterTelaPrincipal() throws Exception {
        telaPrincipal = new TelaPrincipal();
        telaPrincipal.setLocationRelativeTo(telaPrincipal);
        telaPrincipal.setVisible(true);

        telaPrincipal.setTitle("Editor Arquivo BMG");
        telaPrincipal.setExtendedState(TelaPrincipal.MAXIMIZED_BOTH);

        bmgFileService = new BmgFileService();
        contadorPixelService = new ContadorPixelService();
        mapeamentoTextoService = new MapeamentoTextoService(telaPrincipal);
        codificacaoService = new CodificacaoService();
        manipuladorScriptService = new ManipuladorScriptService();
        manipuladorArquivoService = new ManipuladorArquivoService("config.ini");

        instanciarEventos();
        instanciarFontes();
        setarItensAtivosInativos();
        setarItensSelecionados();
    }

    private void instanciarFontes() {
        Font font = new Font("Courier New", Font.PLAIN, 12);
        telaPrincipal.getTxtMessage().setFont(font);
        telaPrincipal.getTblMapeamento().setFont(font);
        telaPrincipal.getTxtMessageComparacao().setFont(font);
        telaPrincipal.getTxtPixels().setFont(font);
    }

    private void setarItensAtivosInativos() {
        telaPrincipal.getBtnAnterior().setEnabled(false);
        telaPrincipal.getBtnProximo().setEnabled(false);
        telaPrincipal.getBtnSalvar().setEnabled(false);
        telaPrincipal.getBtnAbrir().setEnabled(false);
        telaPrincipal.getBtnLimpar().setEnabled(false);
        telaPrincipal.getTxtIr().setEnabled(false);
        telaPrincipal.getBtnIr().setEnabled(false);
        telaPrincipal.getBtnCarregarPixels().setEnabled(false);
        telaPrincipal.getBtnLimparPixels().setEnabled(false);
        telaPrincipal.getMenuExtrairScript().setEnabled(false);
        telaPrincipal.getMenuInserirScript().setEnabled(false);
        telaPrincipal.getMenuSalvar().setEnabled(false);
        telaPrincipal.getMenuSalvarComo().setEnabled(false);
        telaPrincipal.getBtnLimparMapeamento().setEnabled(false);
        telaPrincipal.getBtnCarregarMapeamento().setEnabled(false);
        telaPrincipal.getTxtMessage().setEnabled(false);
        telaPrincipal.getTxtMessageComparacao().setEnabled(false);
        telaPrincipal.getTxtPixels().setEnabled(false);
        telaPrincipal.getTblMapeamento().setEnabled(false);
        telaPrincipal.getRbMenuUnicode().setEnabled(false);
        telaPrincipal.getRbMenuUTF8().setEnabled(false);
        telaPrincipal.getRbMenuANSI().setEnabled(false);
    }

    private void setarItensSelecionados() {
        telaPrincipal.getRbMenuUnicode().setSelected(true);
    }

    private void instanciarEventos() {
        telaPrincipal.getTxtIr().addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent tecla) {
                switch (tecla.getKeyCode()) {
                    case 10: {
                        irParaDialogo(telaPrincipal);
                        contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                    }
                }
            }
        });
        telaPrincipal.getBtnProximo().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                dialogoProximo(telaPrincipal);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getBtnSalvar().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bmgFileService.salvar(telaPrincipal, bmgFileService.getArquivoBmgCorrente(), index);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getBtnAnterior().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                dialogoAnterior(telaPrincipal);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getMenuSalvar().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                manipuladorArquivoService.salvarArquivo(telaPrincipal, bmgFileService.getBmgFilePrincipal(), manipuladorArquivoService, mapeamentoTextoService.getParser(), codificacaoService.getCodificacao(), bmgFileService.getArquivoBmgCorrente(), index);
            }
        });
        telaPrincipal.getMenuSalvarComo().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                manipuladorArquivoService.salvarArquivoComo(telaPrincipal, bmgFileService.getBmgFilePrincipal(), manipuladorArquivoService, mapeamentoTextoService.getParser(), codificacaoService.getCodificacao(), bmgFileService.getArquivoBmgCorrente(), index);
            }
        });
        telaPrincipal.getMenuSair().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.exit(0);
            }
        });
        telaPrincipal.getMenuExtrairScript().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                    manipuladorScriptService.extrairScript(telaPrincipal, bmgFileService.getBmgFilePrincipal(), mapeamentoTextoService.getParser(), manipuladorArquivoService, codificacaoService.getCodificacao());
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
            }
        });
        telaPrincipal.getMenuInserirScript().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                    int retorno = JOptionPane.showConfirmDialog(telaPrincipal, "Atenção!\n\n"
                            + "Caso os códigos especiais do script estejam mapeados,\n"
                            + "carregue o arquivo de mapeamento antes de inseri-lo no\n"
                            + "arquivo. Inserir scripts mapeados sem carregar seu\n"
                            + "mapeamento pode causar bugs irreversíveis. Deseja\n"
                            + "carregar o arquivo de mapeamento antes de prosseguir?\n\n");
                    if (retorno == 0 || retorno == 1) {
                        if (retorno == 0) {
                            mapeamentoTextoService.instanciarArquivoMapeamento(telaPrincipal, bmgFileService.getBmgFilePrincipal(), bmgFileService.getBmgFileComparacao(), codificacaoService.getCodificacao(), index, manipuladorArquivoService);
                        }
                        manipuladorScriptService.inserirScript(telaPrincipal, bmgFileService.getBmgFilePrincipal(), mapeamentoTextoService.getParser(), manipuladorArquivoService, codificacaoService.getCodificacao(), bmgFileService);
                        index = retornarPrimeiroIndiceValido();
                        telaPrincipal.setTitle("Editor Arquivo BMG: *" + bmgFileService.getArquivoBmgCorrente().getName());
                        telaPrincipal.getLblNum().setText((index + 1) + "");
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                        contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                    }
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
            }
        });
        telaPrincipal.getBtnCarregarMapeamento().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mapeamentoTextoService.instanciarArquivoMapeamento(telaPrincipal, bmgFileService.getBmgFilePrincipal(), bmgFileService.getBmgFileComparacao(), codificacaoService.getCodificacao(), index, manipuladorArquivoService);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getBtnLimparMapeamento().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mapeamentoTextoService.limparMapeamento(telaPrincipal, bmgFileService.getBmgFilePrincipal(), bmgFileService.getBmgFileComparacao(), codificacaoService.getCodificacao(), index);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getBtnAbrir().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                    bmgFileService.instanciarArquivoBmgComparacao(telaPrincipal, manipuladorArquivoService, index);
                    if (mapeamentoTextoService.getParser() != null) {
                        telaPrincipal.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                    } else {
                        telaPrincipal.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                    }
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
            }
        });
        telaPrincipal.getBtnLimpar().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bmgFileService.limparBmgFileComparacao(telaPrincipal);
            }
        });
        telaPrincipal.getBtnIr().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                irParaDialogo(telaPrincipal);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getBtnCarregarPixels().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                contadorPixelService.instanciarArquivoDePixels(telaPrincipal, bmgFileService.getBmgFilePrincipal(), codificacaoService.getCodificacao(), manipuladorArquivoService);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getBtnLimparPixels().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                contadorPixelService.limparTelaPixels(telaPrincipal);
            }
        });
        telaPrincipal.getTxtMessage().addKeyListener(new java.awt.event.KeyAdapter() {
            @Override
            public void keyReleased(java.awt.event.KeyEvent evt) {
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
        telaPrincipal.getMenuSobre().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JOptionPane.showMessageDialog(telaPrincipal, "Autor: Vinicius Schulz\nE-mail: vinicius-schulz@hotmail.com\nPágina: http://code.google.com/p/editor-arquivo-bmg/\nFacebook: https://www.facebook.com/vinicius.schulz");
            }
        });
        telaPrincipal.getMenuAbrir().addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                    bmgFileService.instanciarArquivoBmgPrincipal(telaPrincipal, manipuladorArquivoService);
                    index = retornarPrimeiroIndiceValido();
                    telaPrincipal.setTitle("Editor Arquivo BMG: " + bmgFileService.getArquivoBmgCorrente().getName());
                    telaPrincipal.getLblNum().setText((index + 1) + "");
                    if (mapeamentoTextoService.getParser() != null) {
                        telaPrincipal.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                    } else {
                        telaPrincipal.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                    }
                    contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
            }
        });
        telaPrincipal.getBtnAnterior().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_MASK), "anterior");
        telaPrincipal.getBtnAnterior().getActionMap().put("anterior", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialogoAnterior(telaPrincipal);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                telaPrincipal.getTxtMessage().requestFocus();
                telaPrincipal.getTxtMessage().setCaretPosition(0);
            }
        });

        telaPrincipal.getBtnProximo().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK), "proximo");
        telaPrincipal.getBtnProximo().getActionMap().put("proximo", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialogoProximo(telaPrincipal);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                telaPrincipal.getTxtMessage().requestFocus();
                telaPrincipal.getTxtMessage().setCaretPosition(0);
            }
        });


        telaPrincipal.getBtnSalvar().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK), "preSalvar");
        telaPrincipal.getBtnSalvar().getActionMap().put("preSalvar", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int pos = telaPrincipal.getTxtMessage().getCaretPosition();
                bmgFileService.salvar(telaPrincipal, bmgFileService.getArquivoBmgCorrente(), index);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                telaPrincipal.getTxtMessage().requestFocus();
                telaPrincipal.getTxtMessage().setCaretPosition(pos);
            }
        });
        telaPrincipal.getRbMenuUnicode().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    if (bmgFileService.getBmgFilePrincipal() != null) {
                        codificacaoService.setCodificacao(new Unicode());
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                        contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                    }
                    if (bmgFileService.getBmgFileComparacao() != null) {
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                    }
                } catch (Exception ex) {
                    System.err.println(ex.getMessage());
                }
            }
        });
        telaPrincipal.getRbMenuUTF8().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    if (bmgFileService.getBmgFilePrincipal() != null) {
                        codificacaoService.setCodificacao(new UTF8());
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                        contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                    }
                    if (bmgFileService.getBmgFileComparacao() != null) {
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                    }
                } catch (Exception ex) {
                    System.err.println(ex.getMessage());
                }
            }
        });

        telaPrincipal.getRbMenuANSI().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    if (bmgFileService.getBmgFilePrincipal() != null) {
                        codificacaoService.setCodificacao(new ANSI());
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                        contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
                    }
                    if (bmgFileService.getBmgFileComparacao() != null) {
                        if (mapeamentoTextoService.getParser() != null) {
                            telaPrincipal.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                        } else {
                            telaPrincipal.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                        }
                    }
                } catch (Exception ex) {
                    System.err.println(ex.getMessage());
                }
            }
        });

        telaPrincipal.getTxtDefinirManualmente().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(java.awt.event.KeyEvent evt) {
                contadorPixelService.setQtdPixelLinha(Integer.parseInt(telaPrincipal.getTxtDefinirManualmente().getText()));
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });

        telaPrincipal.getSpInformeEndereco().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                byte[] dataPonteiro = bmgFileService.getBmgFilePrincipal().getDataPonteiro(index);
                contadorPixelService.setQtdPixelLinha(ManipuladorDados.obterValorDecimal(dataPonteiro, (Integer) telaPrincipal.getSpInformeEndereco().getValue(), 2));
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });

        telaPrincipal.getRbDefinirAutomaticamente().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                telaPrincipal.getTxtDefinirManualmente().setEnabled(false);
                telaPrincipal.getSpInformeEndereco().setEnabled(true);
                ((JSpinner.DefaultEditor) telaPrincipal.getSpInformeEndereco().getEditor()).getTextField().setEditable(false);
                telaPrincipal.getRbDefinirAutomaticamente().setEnabled(true);
                telaPrincipal.getRbDefinirManualmente().setEnabled(true);
                telaPrincipal.getLblInformeEndereco().setEnabled(true);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });

        telaPrincipal.getRbDefinirManualmente().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                telaPrincipal.getTxtDefinirManualmente().setEnabled(true);
                telaPrincipal.getSpInformeEndereco().setEnabled(false);
                ((JSpinner.DefaultEditor) telaPrincipal.getSpInformeEndereco().getEditor()).getTextField().setEditable(false);
                telaPrincipal.getRbDefinirAutomaticamente().setEnabled(true);
                telaPrincipal.getRbDefinirManualmente().setEnabled(true);
                telaPrincipal.getLblInformeEndereco().setEnabled(false);
                contadorPixelService.preencherTelaPixels(telaPrincipal, mapeamentoTextoService.getParser(), bmgFileService.getBmgFilePrincipal());
            }
        });
    }

    private int proxPonteiro() {
        int i = index + 1;
        boolean flag = false;

        if (i > bmgFileService.getBmgFilePrincipal().getNumeroPonteiros() - 1) {
            return index;
        } else {
            while (!bmgFileService.getBmgFilePrincipal().ponteiroIsValido(i)) {
                if (i < bmgFileService.getBmgFilePrincipal().getNumeroPonteiros() - 1) {
                    i++;
                } else {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                return index;
            } else {
                return i;
            }
        }
    }

    private int antPonteiro() {
        int i = index - 1;
        boolean flag = false;

        if (i < 0) {
            return index;
        } else {
            while (!bmgFileService.getBmgFilePrincipal().ponteiroIsValido(i)) {
                if (i > 0) {
                    i--;
                } else {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                return index;
            } else {
                return i;
            }
        }
    }

    private int retornarPrimeiroIndiceValido() {
        int i = 0;
        while (!bmgFileService.getBmgFilePrincipal().ponteiroIsValido(i)) {
            i++;
        }
        return i;
    }

    public void dialogoProximo(TelaPrincipal form) {
        try {
            if (bmgFileService.getBmgFilePrincipal() != null) {
                index = proxPonteiro();
                if (mapeamentoTextoService.getParser() != null) {
                    form.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                } else {
                    form.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                }
                form.getLblNum().setText((index + 1) + "");
            }
            if (bmgFileService.getBmgFileComparacao() != null) {
                if (mapeamentoTextoService.getParser() != null) {
                    form.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                } else {
                    form.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                }
            }
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    public void dialogoAnterior(TelaPrincipal form) {
        try {
            if (bmgFileService.getBmgFilePrincipal() != null) {
                index = antPonteiro();
                if (mapeamentoTextoService.getParser() != null) {
                    form.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                } else {
                    form.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                }
                form.getLblNum().setText((index + 1) + "");
            }
            if (bmgFileService.getBmgFileComparacao() != null) {
                if (mapeamentoTextoService.getParser() != null) {
                    form.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao())));
                } else {
                    form.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(index), codificacaoService.getCodificacao().getCodificacao()));
                }
            }
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    public void irParaDialogo(TelaPrincipal form) {
        try {
            if (bmgFileService.getBmgFilePrincipal() != null) {
                if (form.getTxtIr().getText().trim().equals("")) {
                    JOptionPane.showMessageDialog(form, "Campo vazio!");
                } else {
                    if (Integer.parseInt(form.getTxtIr().getText()) - 1 >= 0 && Integer.parseInt(form.getTxtIr().getText()) - 1 < bmgFileService.getBmgFilePrincipal().getNumeroPonteiros()) {
                        if (bmgFileService.getBmgFilePrincipal().ponteiroIsValido(Integer.parseInt(form.getTxtIr().getText()) - 1)) {
                            if (mapeamentoTextoService.getParser() != null) {
                                form.getTxtMessage().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(Integer.parseInt(form.getTxtIr().getText()) - 1), codificacaoService.getCodificacao().getCodificacao())));
                            } else {
                                form.getTxtMessage().setText(new String(bmgFileService.getBmgFilePrincipal().getDataTexto(Integer.parseInt(form.getTxtIr().getText()) - 1), codificacaoService.getCodificacao().getCodificacao()));
                            }
                            if (bmgFileService.getBmgFileComparacao() != null) {
                                if (mapeamentoTextoService.getParser() != null) {
                                    form.getTxtMessageComparacao().setText(mapeamentoTextoService.getParser().parseOutAllCodes(new String(bmgFileService.getBmgFileComparacao().getDataTexto(Integer.parseInt(form.getTxtIr().getText()) - 1), codificacaoService.getCodificacao().getCodificacao())));
                                } else {
                                    form.getTxtMessageComparacao().setText(new String(bmgFileService.getBmgFileComparacao().getDataTexto(Integer.parseInt(form.getTxtIr().getText()) - 1), codificacaoService.getCodificacao().getCodificacao()));
                                }
                            }
                            index = Integer.parseInt(form.getTxtIr().getText()) - 1;
                            form.getLblNum().setText(form.getTxtIr().getText());
                        } else {
                            JOptionPane.showMessageDialog(form, "Ponteiro da posição inválido. Escolha outro diálogo!");
                        }
                    } else {
                        JOptionPane.showMessageDialog(form, "Posição inválida!");
                    }
                }
            }
            form.getTxtIr().setText("");
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(form, "Entrada inválida");
        }
        form.getTxtMessage().requestFocus();
        form.getTxtMessage().setCaretPosition(0);
    }
}
